import router from './router'
import store from './store'
import NProgress from 'nprogress'                 // 进度条栏
import 'nprogress/nprogress.css'                  // 进度条栏样式
import { getToken } from '@/utils/auth'           // 获取登录的token
import getPageTitle from '@/utils/get-page-title'
import U from '@/utils/UT'

NProgress.configure({ showSpinner: false })       // 进度条栏配置

const whiteList = ['/auth-bind-wx', '/auth-bind-success', '/login', '/auth-redirect']    // 不需要重定向的路由白名单


/**
 * 递归获取侧边栏菜单列表中固定菜单
 * @param list 侧边栏菜单列表
*/
let fixMenuList = [];
const sessionTabs = JSON.parse(sessionStorage.getItem("tabsItem"));
function filterSideMenuList(list) {
  list.forEach(m => {
    const tmp = { ...m };

    if (tmp.children) fixMenuList.concat(filterSideMenuList(tmp.children));
    
    if(m.meta.affix){// 固定菜单，保存
      if(fixMenuList.findIndex(a => a.path == tmp.path) == -1) fixMenuList.push(tmp);
    }
    
    // else if(sessionTabs){// 在缓存页面中的菜单，也保存
    //   let o = sessionTabs.cachedViews.find(it => (tmp.path.indexOf(it) != -1) || it == tmp.name);
    //   if(o || sessionTabs.currTabsPath === m.path){
    //     // 不存在当前菜单，才加入
    //     if(fixMenuList.findIndex(a => a.path == tmp.path) == -1) fixMenuList.push(tmp);
    //   }
    // }
  });
  return fixMenuList;
}

router.beforeEach(async(to, from, next) => {
  // 设置页面标题
  document.title = getPageTitle('');
  
  // 进度条栏-开始
  NProgress.start();
  
  // 确定用户是否已登录
  const hasToken = getToken();
  if (hasToken) {// 已登录
    if (to.path === '/login') {
      // 如果已登录，则重定向到主页
      next({ path: '/' });

      // 进度条栏-完成
      NProgress.done();
    }else {
      // console.log('当前路由', to);
      // 检查store缓存中是否存在侧边栏菜单列表数据（此处是唯一生成侧边栏数据处）
      let sideMenuList = store.getters.side_menu_list;
      if(sideMenuList.length == 0){
        // 不存在，则调用方法生成 使用await关键字变成同步请求
        await store.dispatch('permission/getSideMenuList').then(res => {
          // 保存登录用户信息
          store.dispatch('user/setLInfo', res.luser);
          

          // console.log('侧边栏菜单列表：', store.getters.side_menu_list);
          // console.log('缓存的菜单标签数据：', sessionTabs);

          // 将固定路由保存至tab标签列表
          // let len = fixMenuList.length;
          // fixMenuList.splice(0, len); // 清空一下
          // fixMenuList.length = 0;
          
          // affixMenuList.forEach(it => {
            // let m = U.findTreeListObj(store.getters.side_menu_list, 'path', it.path);
            // // 添加tab标签
            // if(m) store.dispatch('tagsView/addVisitedView', it);

            // store.dispatch('tagsView/addVisitedView', it);
            // store.dispatch('tagsView/addView', it);
          // });

          // // 清除不在权限菜单内的tag标签及缓存页面
          // let tags = store.state.tagsView.visitedViews, newTags = [];
          // console.log('当前标签列表', tags);
          // tags.forEach(it => {
          //   let m = U.findTreeListObj(store.getters.side_menu_list, 'path', it.path);
          //   if(!m) {
          //     store.dispatch('tagsView/delView', it);// 删除tab标签
          //   }else{
          //     newTags.push(it);
          //   }
          // });
          
          // if(to.path && to.path.indexOf('/dashboard') != -1){
          //   // 跳转到默认的首页，则看功能菜单数据列表中是否存在，存在则跳转，不存在则跳转默认的固定菜单
          //   let affixMenuList = filterSideMenuList(store.getters.side_menu_list);
          //   let m = U.findTreeListObj(affixMenuList, 'path', to.path);
          //   (!m && fixMenuList.length > 0) ? next(fixMenuList[0].path) : next();
          // }else{

            

            // // 设置浏览器页面标题
            // let m = U.findTreeListObj(store.getters.side_menu_list, 'path', to.path);
            // if(m) {
            //   document.title = getPageTitle(m.meta.title);
            //   // 最后-生成标签并缓存当前页面
            //   store.dispatch('tagsView/addView', to);
            // }else{
            //   // 删除tab标签
            //   store.dispatch('tagsView/delView', to);

            //   next(newTags[0].path);
            // }
          // }

          
        }).catch(err => { console.log(err); });

        // 重新赋值
        sideMenuList = store.getters.side_menu_list;
        if(sideMenuList.length == 0){
          next(`/login`);
        }else{
          // 获取-权限菜单中所有固定菜单
          filterSideMenuList(store.getters.side_menu_list);
          // console.log('固定菜单数组', fixMenuList);

          // 添加固定菜单-tab标签
          let newFixMenuList = [];
          fixMenuList.forEach(it => {
            let m = U.findTreeListObj(sideMenuList, 'path', it.path);
            if(m) {
              newFixMenuList.push(it);

              store.dispatch('tagsView/addVisitedView', it);
            }
          });
          // 重新赋值
          fixMenuList = newFixMenuList;

          // 遍历tab标签删除不存在权限菜单内的tab标签
          let tags = store.state.tagsView.visitedViews;
          // console.log('当前tab标签：', tags);
          tags.forEach(it => {
            let m = U.findTreeListObj(sideMenuList, 'path', it.path);
            if(!m) store.dispatch('tagsView/delVisitedView', it);
          });

          // 验证当前路由是否存在权限功能内
          let path = to.path.indexOf('/redirect') != -1 ? to.path.replace('/redirect', '') : to.path;
          let m2 = U.findTreeListObj(sideMenuList, 'path', path);
          if(!m2){
            // 当前访问的路由不存在权限菜单内，则跳转第一个固定菜单
            next(fixMenuList[0].path);
          }else{
            // 添加当前访问路由的标签
            store.dispatch('tagsView/addView', m2);


            // 设置浏览器页面标题
            let m = U.findTreeListObj(store.getters.side_menu_list, 'path', to.path);
            if(m) document.title = getPageTitle(m.meta.title);

            next();
          }
        }
      }else{
        // if(to.path && to.path.indexOf('/dashboard') != -1){
        //   // 跳转到默认的首页，则看功能菜单数据列表中是否存在，存在则跳转，不存在则跳转默认的固定菜单
        //   let affixMenuList = filterSideMenuList(store.getters.side_menu_list);
        //   let m = U.findTreeListObj(affixMenuList, 'path', to.path);
        //   (!m && fixMenuList.length > 0) ? next(fixMenuList[0].path) : next();
        // }else{
          // 设置浏览器页面标题
          // let m = U.findTreeListObj(sideMenuList, 'path', to.path);
          // if(m) document.title = getPageTitle(m.meta.title);
        // }

        // 验证当前路由是否存在权限功能内
        let path = to.path.indexOf('/redirect') != -1 ? to.path.replace('/redirect', '') : to.path;
        let m = U.findTreeListObj(sideMenuList, 'path', path);
        if(!m){
          // 当前访问的路由不存在权限菜单内，则跳转第一个固定菜单
          next(fixMenuList[0].path);
        }else{
          store.dispatch('tagsView/addView', m);


          // 设置浏览器页面标题
          document.title = getPageTitle(m.meta.title);

          next();
        }
      }

      
    }
  } else {// 未登录
    // 未登录，清空侧边栏菜单数组
    setTimeout(() => {
      // 延时清除，以保证不报错，因为侧边栏数据使用了ng-if
      store.dispatch('permission/delAllSideMenuList');
    }, 500);

    if (whiteList.indexOf(to.path) !== -1) {
      // 导航路由在路由白名单中直接进入
      next();
    } else {
      // 其他没有访问权限的页面将被重定向到登录页面
      next(`/login?redirect=${to.path}`);

      // 进度条栏-完成
      NProgress.done()
    }

  }
})

router.afterEach(() => {
  // 进度条栏-完成
  NProgress.done()
})
